package com.littleHan.brushQuestions.web.userCenter.service;

import com.littleHan.brushQuestions.exception.FailedToDeleteException;
import com.littleHan.brushQuestions.exception.FailedToLoadException;
import com.littleHan.brushQuestions.exception.FailedToUpdateException;
import com.littleHan.brushQuestions.exception.FailedToUploadException;
import com.littleHan.brushQuestions.web.start.pojo.GeneralUser;
import com.littleHan.brushQuestions.web.start.pojo.Permission;
import com.littleHan.brushQuestions.web.userCenter.pojo.Pagination;
import io.minio.errors.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;

public interface UserCenterService {

    /**
     * 根据用户id获取能访问的路径信息。
     *
     * @param userId
     * @return
     */
    List<Permission> getNavigationBar(String userId) throws FailedToLoadException;

    /**
     * 获取普通用户的个人信息
     *
     * @param userId 用户id
     * @return
     */
    GeneralUser getMyInfo(String userId) throws FailedToLoadException, FailedToUploadException;

    /**
     * 修改个人资料
     *
     * @param userId      用户id
     * @param generalUser 普通用户实例
     * @throws FailedToLoadException
     */
    void editUserInfo(String userId, GeneralUser generalUser) throws FailedToLoadException;

    /**
     * 上传个人头像
     * @param userId 用户id
     * @param file 上传的头像文件
     * @throws FailedToUpdateException
     */
    String uploadIcon(String userId, MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, FailedToUpdateException;

    /**
     * 根据用户id获取其收藏的题目
     *
     * @param userId 用户id
     * @param pagination 页码对象
     * @return 返回map集合携带题目数据以及总条数信息
     * @throws FailedToLoadException
     */
    Map<String, Object> getUserCollectTopicList(String userId, Pagination pagination) throws FailedToLoadException;

    /**
     * 取消收藏的题目根据收藏id
     *
     * @param id 收藏id
     */
    void cancelTopicByCollectId(String id) throws FailedToDeleteException;

    /**
     * 根据用户id获取所有评论以及题目（进行分页）
     *
     * @param pageNo   从第几个开始
     * @param pageSize 显示几个
     * @param userId   用户id
     * @return
     * @throws FailedToLoadException
     */
    Map<String, Object> getUserAllComment(int pageNo, int pageSize, String userId) throws FailedToLoadException;

    /**
     * 根据评论id删除评论
     *
     * @param id 评论id
     */
    void deleteMyComment(String id) throws FailedToDeleteException;

    /**
     * 获取用户未读的消息通知
     *
     * @param pagination 分页对象
     * @param userId     用户id
     * @return
     */
    Map<String, Object> getUserNotice(Pagination pagination, String userId);

    /**
     * 将消息通知设置未已读，根据通知id
     *
     * @param id 消息通知实例，携带消息通知id
     */
    void setNoticeIsCheck(String id) throws FailedToUpdateException;
}
